Los vectores tienen un método insert que permite insertar un valor enmedio del vector (en vez de añadirlo al final del vector como hace push_back).
La inserción se hace siempre teniendo en cuenta un iterador, pongamos que se llama it. El iterador it nos indica una posición del vector y en el método insert indica dónde queremos que resida el elemento que queremos insertar. Para hacerlo, se desplazan hacia arriba los elementos que estaban en esa posición, añadiendo una casilla al final. Si el vector contiene las casillas:
0 0 0 0 0
y tenemos un iterador que apunta a la tercera casilla, insertar un -1 dejará el vector así:
0 0 -1 0 0 0
porque se desplazan los 3 ceros para permitir que el -1 ocupe la casilla que indicaba el iterador.
La forma de llamar a insert para el ejemplo que acabamos de ver seria la siguiente:
vector<int> v(5); vector<int>::iterator it = v.begin(); it++; it++; // nos colocamos en la tercera casilla v.insert(it, -1);
El método se invoca como todos los métodos, anteponiendo v. y luego se pasa el iterador como primer parámetro (la posición donde hay que insertar) seguido del valor que queremos poner en esa posición.
Es interesante ver que insert también funciona correctamente cuando se pone un iterador como v.end() que en teoría indica una posición "no válida". Es decir, hacer:
v.insert(v.end(), 3);
inserta un 3 al final del vector. Esencialmente, le pedimos a insert que desplace las casillas que hay en v.end() para hacer caber el 3. Este tipo de consistencia conceptual es típica de la STL.
En esta versión podemos indicar cuantas copias queremos insertar de cierto valor. Ahora el método recibirá 3 parámetros: el primero seguirá siendo la posición donde insertar (un iterador), el segundo ahora es la cantidad de valores que queremos insertar, y el último parámetro es el valor a insertar.
Siguiendo con el ejemplo:
v.insert(v.begin(), 3, 9);
inserta 3 nueves al principio del vector.
La última versión permite insertar los valores de otro contenedor. En particular, de otro vector. Si tenemos otro vector como:
vector<int> w(3, 20);
que tiene 3 casillas, todas con un 20, podemos insertar todas estos valores en v a partir de la tercera posición haciendo lo siguiente (continuando el ejemplo):
it = v.begin(); it++; it++; v.insert(it, w.begin(), w.end());
Ahora los 3 parámetros son: la posición donde insertar, y las posiciones inicial y final de otro contenedor (vector, lista, etc.) desde donde vamos a sacar los valores. En este caso hemos insertado 3 veintes a partir de la tercera casilla.
En preparación